/*****************************************************************************/
/*                                                                           */
/*    Domino Operation System Driver Module                                  */
/*                                                                           */
/*    Copyright (C) 2008-2013 Laszlo Arvai                                   */
/*                                                                           */
/*    ------------------------------------------------------------------   */
/*    Memory access (PC Emulation for C array)                               */
/*****************************************************************************/

///////////////////////////////////////////////////////////////////////////////
// Includes files
#include <drvMemoryAccess.h>

///////////////////////////////////////////////////////////////////////////////
// Module local variables
extern unsigned char g_resource_file[];

///////////////////////////////////////////////////////////////////////////////
// Init ROM Access
void krnlInitMemoryAccess(void)
{
}

///////////////////////////////////////////////////////////////////////////////
// Read byte from ROM
dosByte dosWinEmuROMReadByte( int in_address )
{
	return g_resource_file[in_address];
}

///////////////////////////////////////////////////////////////////////////////
// Read word from ROM
dosWord dosWinEmuROMReadWord( int in_address )
{
	return g_resource_file[in_address] + ((g_resource_file[in_address+1]) << 8);
}

///////////////////////////////////////////////////////////////////////////////
// Read double word from ROM
dosDWord dosWinEmuROMReadDWord( int in_address )
{
	return ((dosDWord)g_resource_file[in_address]) + 
					(((dosDWord)g_resource_file[in_address+1]) << 8) +
					(((dosDWord)g_resource_file[in_address+2]) << 16) +
					(((dosDWord)g_resource_file[in_address+3]) << 24);
}

///////////////////////////////////////////////////////////////////////////////
// Read MSB first word from ROM
dosWord dosWinEmuROMReadReverseWord( int in_address )
{
	return ((g_resource_file[in_address]) << 8) + g_resource_file[in_address+1];
}

///////////////////////////////////////////////////////////////////////////////
// String resource functions
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
// Get resource string length
dosDWord krnlGetResourceStringLength( dosHandle in_string_handle )
{
  dosDWord length = 0;
  dosByte data;
  dosROMAddress address;

  address = /*l_string_resource + */in_string_handle;

  do
  {
    data = dosROMReadByte( address++ );

    length = (length << 7) + (data & 0x7f);
  } while( data > 127 );

  return length;
}

///////////////////////////////////////////////////////////////////////////////
// Get resorce string
dosROMAddress krnlGetResourceString( dosHandle in_string_handle )
{
  dosROMAddress address;

  address = /*l_string_resource + */in_string_handle;

  while( dosROMReadByte( address++ ) > 127 );

  return address;
}


